package com.zjw.socket.demo.starter.messageService;

public class MessageProcessStrategy {

  /**
   * 目的id不在线，是否缓存此消息。
   * 一个基础验证，即设置此FLAG，客户端收到信息后必须通知服务端，否则服务端不会清除缓存
   * 如果有必要，服务端会重新发送。
   */
  public static final int OFFLINE_TO_ID_CACHE_MASK = 0x01;

  /**
   * 是否好友id才能发送
   */
  public static final int TO_ID_IS_FRIEND_SEND_MASK = OFFLINE_TO_ID_CACHE_MASK << 1;

  /**
   * 如果此消息缓存，同类消息是否保持最新（移除掉旧版同类消息）
   */
  public static final int KEEP_MESSAGE_TYPE_LATEST_MASK = OFFLINE_TO_ID_CACHE_MASK << 2;

  /**
   * 如果服务端收到此消息，是否回复发送端
   */
  public static final int RESPONSE_MESSAGE_IF_SERVICE_ACCEPT_MASK = OFFLINE_TO_ID_CACHE_MASK << 3;

  /**
   * 如果接收端收到此消息，是否回复发送端
   */
  public static final int RESPONSE_MESSAGE_IF_TO_ACCEPT_MASK = OFFLINE_TO_ID_CACHE_MASK << 4;

  /**
   * 如果bytes被加密，此位为1
   */
  public static final int BODY_ENCRYPTION_MASK = OFFLINE_TO_ID_CACHE_MASK << 31;

  public static boolean hasFlag(int processStrategy, int flag) {
    return (processStrategy & flag) != 0;
  }

  public static boolean hasFlagsAnyOf(int processStrategy, int... flags) {
    for (int flag : flags) {
      if (hasFlag(processStrategy, flag)) {
        return true;
      }
    }
    return false;
  }

  public static boolean hasFlagsAllOf(int processStrategy, int... flags) {
    for (int flag : flags) {
      if (!hasFlag(processStrategy, flag)) {
        return false;
      }
    }
    return true;
  }

  public static int createProcessStrategy(int... flags) {
    int res = 0;
    for (int flag : flags) {
      res |= flag;
    }
    return res;
  }
}
